/*
 * @Version: 1.0
 * @Author: ZPK
 * @Date: 2022-11-13 14:23:38
 * @LastEditors: ZPK
 * @LastEditTime: 2022-11-19 15:35:24
 */
// 泛型可以指定默认值  默认泛型  给泛型增加了默认值
type Union<T =string> = T | number  //场景就是如果用户不传入类型  我也希望有默认值

type t1 = Union
type t2 = Union<boolean>
// 泛型约束，约束传入的泛型类型 extends 比如： A extends B  A是B的子类型

function handle<T extends number | string>(val:T):T{
    return val
}
let r1 = handle(123)
// let r3 = handle(true)
interface IWithLength{
    length:number
}
function getLen<T extends IWithLength>(val:T){
    return val.length
}
getLen('adc')

// 约束索引的签名
function getVal<T extends object,K extends keyof T > (obj:T,key:K){
    return obj[key]
}
getVal({a:1,b:2,c:3},'c')


// 条件类型 也会配合我们这个泛约束



// 对象中可以使用泛型  常见的就是描述接口的返回值
interface ApiRespinse<T=any>{
    code:number,
    data:T,
    message?:string
}
interface LoginRes{
    token:string
}
function toLogin():ApiRespinse<LoginRes>{
    return {
        code:200,
        data:{
            token:'bearer token'
        },
    }
}

let r = toLogin()
r.data.token

// 类中可以使用泛型
// 求列表中的最大值，调用的时候可以限制传入的类型
class MyList<T>{
    private arr:T[] = []
    add(val:T){
        this.arr.push(val)
    }
    getMax():T{
        let arr = this.arr
        let max = arr[0]
        for(let i=0;i<arr.length;i++){
            let cur = arr[i]
            cur>max ? (max = cur) :void 0
        }
        return max
    }
}
let list = new MyList<number>()
list.add(1)

// 函数  对象  类  在工具类型  泛型中 两个重要的 默认值 约束
export{}